"""
项目1：随机密码生成器（函数版本）
功能：生成指定长度的随机密码
特点：使用函数封装，代码模块化，便于维护和扩展
作者：计算机与人工智能协会
日期：2025

学习建议：
    先学习 password_generator_simple.py（零基础版本）
    理解基本逻辑后，再学习本文件（函数版本）
    对比两个版本，体会函数的优势
"""

import random
import string


# ============ 工具函数区 ============

def validate_length(length):
    """
    验证密码长度是否合法
    参数：length - 密码长度
    返回：(是否合法, 错误信息)
    """
    if length < 4:
        return False, "密码长度太短，建议至少4位！"
    if length > 50:
        return False, "密码长度太长，建议不超过50位！"
    return True, ""


def generate_password(length, use_letters=True, use_numbers=True, use_symbols=False):
    """
    生成随机密码
    
    参数：
        length - 密码长度
        use_letters - 是否包含字母（默认True）
        use_numbers - 是否包含数字（默认True）
        use_symbols - 是否包含特殊符号（默认False）
    
    返回：
        生成的密码字符串，如果出错则返回None
    
    示例：
        >>> generate_password(8)  # 生成8位字母+数字密码
        'aB3xK9mN'
        >>> generate_password(10, use_symbols=True)  # 包含特殊符号
        'aB3@xK9#mN'
    """
    # 构建字符集
    characters = ""
    
    if use_letters:
        characters += string.ascii_letters  # 添加大小写字母
    if use_numbers:
        characters += string.digits  # 添加数字0-9
    if use_symbols:
        characters += "!@#$%^&*"  # 添加特殊符号
    
    # 检查是否至少选择了一种字符类型
    if not characters:
        print("错误：至少选择一种字符类型！")
        return None
    
    # 使用更Pythonic的方式生成密码
    password = ''.join(random.choice(characters) for _ in range(length))
    
    return password


def print_welcome():
    """打印欢迎信息"""
    print("=" * 50)
    print("        欢迎使用随机密码生成器")
    print("        (函数封装版本)")
    print("=" * 50)
    print()


def print_menu():
    """打印菜单"""
    print("\n请选择模式：")
    print("1. 基础模式（字母+数字）")
    print("2. 自定义模式（可选字符类型）")
    print("3. 退出程序")


def get_password_length():
    """
    获取并验证密码长度
    返回：密码长度(int)，如果输入无效返回None
    """
    try:
        length = int(input("请输入密码长度(建议8-16位)："))
        is_valid, error_msg = validate_length(length)
        
        if not is_valid:
            print(error_msg)
            return None
        
        return length
    except ValueError:
        print("输入错误，请输入数字！")
        return None


def basic_mode():
    """基础模式：生成字母+数字密码"""
    length = get_password_length()
    if length is None:
        return  # 输入无效，直接返回
    
    password = generate_password(length, use_letters=True, use_numbers=True, use_symbols=False)
    
    if password:
        print(f"\n生成的密码是：{password}")
        print(f"密码长度：{len(password)}位")


def custom_mode():
    """自定义模式：用户选择字符类型"""
    length = get_password_length()
    if length is None:
        return  # 输入无效，直接返回
    
    print("\n请选择密码包含的字符类型：")
    use_letters = input("包含字母？(y/n)：").lower() == 'y'
    use_numbers = input("包含数字？(y/n)：").lower() == 'y'
    use_symbols = input("包含特殊符号？(y/n)：").lower() == 'y'
    
    password = generate_password(length, use_letters, use_numbers, use_symbols)
    
    if password:
        print(f"\n生成的密码是：{password}")
        print(f"密码长度：{len(password)}位")


# ============ 主程序 ============

def main():
    """
    主程序 - 使用函数封装后的版本
    """
    print_welcome()
    
    while True:
        print_menu()
        choice = input("\n请输入选项(1-3)：")
        
        if choice == "1":
            basic_mode()
        elif choice == "2":
            custom_mode()
        elif choice == "3":
            print("\n感谢使用，再见！")
            break
        else:
            print("输入错误，请输入1-3之间的数字！")


if __name__ == "__main__":
    main()


